genererBreak(Params, Retour) :- traitements(Params, 16, Retour), verifierBreak(Retour).
genererBreak(Params, Longeur, Retour) :- traitements(Params, Longeur, Retour), verifierBreak(Retour).

traitements([], _, []).
traitements([_-NbNotes|Params], Longueur, [Ligne|Retour]) :- length(ListeDestruc, Longueur), remplir(ListeDestruc, 0, Liste),  genererLigne(NbNotes, Liste, Ligne), traitements(Params, Longueur, Retour).


remplir([], _, []).
remplir([_|Liste], El, [El|Suite]) :- remplir(Liste, El, Suite).

genererLigne(0, Liste, Liste) :- !.
genererLigne(NbNotes, [_|Liste], [1|Ligne]) :- NewNbNotes is (NbNotes - 1), genererLigne(NewNbNotes, Liste, Ligne).
genererLigne(NbNotes, [_|Liste], [0|Ligne]) :- genererLigne(NbNotes, Liste, Ligne).

verifierBreak([Fin|_]) :- length(Fin, 0).
verifierBreak(Break) :- addAll(Break, Max), Max is 0, deleteFirst(Break, SuiteBreak), verifierBreak(SuiteBreak).
verifierBreak(Break) :- addAll(Break, Max), Max is 1, deleteFirst(Break, SuiteBreak), verifierBreak(SuiteBreak).


addAll([], 0).
addAll([[X|_]|Break], K) :- addAll(Break, A), (K is (A+X)).

deleteFirst([], []).
deleteFirst([[_|Liste]|Break], [Liste|SuiteBreak]) :- deleteFirst(Break, SuiteBreak).